【精选】java转go(go语法的不同点)

您所在的位置:网站首页 java golang语法对比 【精选】java转go(go语法的不同点)

【精选】java转go(go语法的不同点)

2023-11-16 11:15| 来源: 网络整理| 查看: 265

某个源文件A中调用的源文件B中有init()函数,那么B中的init()函数会先被执行,A中的init()后执行,在main()函数中也是一样的

匿名函数,函数定义了仅适用一次,并且定义了完了就直接使用

func main(){ result := func (参数1 int , 参数2 int) int{//匿名函数,定义的同时直接调用 return 8 }(传入参数1 , 传入参数2) }

闭包:某个匿名函数+其所引用的变量/参数 = 闭包 ; 直观的可以认为实现了类似于java中的静态变量 (对内存消耗较大)

func getSum () func (num int) int{ //该getSum函数解释:该函数返回另一个函数(假设叫做A函数,实际可以是一个匿名函数),A函数有一个int类型的参数,且返回一个int类型的值 var sum int = 0 return func (num int) int{ //这里就是getSum返回了一个匿名函数 sum += num return sum } } func main(){ f := getSum() //函数可以赋值给变量,这里将上面的匿名函数赋值给了f f(1)//返回值为1 f(2)//返回值为3 f(3)//返回值为6 f(2)//返回值为8 //观察上面的返回值发现,f(int)函数调用的时候getSum()中的sum变量未被清零,类似于java中给sum做了静态处理,这就是闭包的体现 }

defer关键字:defer关键字后面的语句不会立即被执行,而是程序执行这一句时,将这一行代码和此时所含有的数据都(即:这行代码其中的变量此时的值也会被保存,不会因为后面执行变量值的更改而更改)压入程序栈中(注意栈结构的特性:先进后出),然后继续执行后面的代码,当整个函数体被执行完之后(return也执行完之后),再从栈中按后进先出取出代码执行。这个非常适合用于释放资源(数据库连接资源)

package main import "fmt" func main(){ fmt.Println(add(10 , 10)) } func add(numA int , numB int) int{ defer fmt.Println("numA=",numA) fmt.Println("===1") defer fmt.Println("numB=",numB) fmt.Println("===2") numA += 10 numB += 20 fmt.Println("===3") fmt.Println("numA+numB",numA+numB) return numA + numB } 对应的控制台输出为: ===1 ===2 ===3 numA+numB 50 numB=10 numA=10 50

字符串与整数相互转换

//需要导入strconv包 str := "56" num := 45 num1 , _:= strconv.Atoi(str) //字符串转整数 , 该函数有两个返回值 str1 := strconv.Itoa(num)//整数转字符串 fmt.Println(num1) fmt.Println(str1)

字符串相关操作的函数在strings包中,(在第一点的文档中可查看)

时间相关函数在time包中

new(type)函数,参数为某一个类型/结构体类型,用于开辟一块该类型数据的空间,并返回该内存指针。

异常捕获:defer关键字 和 recover()函数一起使用,使用defer定义一个函数(匿名函数),在函数用直接使用recover()函数,当程序出现错误时,就会执行recover(),捕获到错误,返回一个error类型的值,正常没有错误recover()返回的值为nil ,nil的类型也是error类型,但它表示没有错误的意思,判断返回值是否为nil,就可以知道是否捕获到了一个异常(错误),返回值可以直接打印。

自定义异常,使用error包下的New(错误)函数,返回一个error类型,即可自定义一个错误,错误可以当做函数的返回值返回

程序终止函数,go语言内置函数panic(error类型参数),可以直接终止程序

数组定义 :

var array [length]int //定义并初始化: var array1 [3]int = []int{1,2,3} var array2 = [3]int{1,2,3} var array3 = [...]int{1,2,3} var array4 = [...]int{2:1,0:2,1:3} // 冒号前面的是下标,后面是数组对应下标位置的数据 //二位数组 var arrayTow [1][2]int var arrayTow2 = [...][...]int{{1,2,3},{1,5,6}} //数组的打印,可以直接打印 fmt.Println(array2) // 结果:[1,2,3]

在go语言中数组作为函数的参数时进行的是值传递,即:数组作为参数传递到一个函数中,并在函数中对该数组进行修改,此时修改的只是一个数组的拷贝,而不是原数组。如果想要直接改变原来的数组的内容,那么就传递数组的指针即可

切片(slice):是对数组连续内存的引用(即存储了数组中某个片段内每个元素的地址)

int array [6]int = [6]int{1,2,3,4,5,6} slice := array[1:3]//slice就是一个切片 , 将数组下标[1,3)区间内的引用给切片,注意是左闭右开区间 len(slice)//切片的长度 cap(slice)//切片的容量

make(切片类型,切片的长度,切片的容量),使用该函数可以创建一个切片

func main(){ splice := make(int[] , 4 , 20)//创建一个底层为数组的,长度为4 , 容量为20 的切片 //该切片中的数组,是不能直接操作到该数组的,需要通过切片间接的操作。而45点中,是先创建了数组,再使用数组创建切片,数组本身是可以拿到的。 }

切片可以再次进行切片

map映射,key-value形式存储数据,类似于java中的hashmap,声明方式: map[key的类型]value的类型

var amap map[int]string // 这样只是声明了一个map变量,但并未给变量开辟存储空间 amap = make(map[int]string , 10)//通过make()函数创建map , 第二个参数时map的长度 bmap := make(map[string]int)//第二个参数可以不写,默认就分配一个内存 amap[1] = "shuju1" amap[2] = "shuju2" // map的中添加数据的方式 类似于数组 fmt.Println(amap)//打印整个数据 fmt.Println(amap[1])//根据key获取数据 cmap := map[int]string{ //这样也可以创建map 111: "222", 22: "2233" } //key重复时,value会覆盖 amap[1] //会返回两个值,第一个为value ,第二个为是否存在的标志flag(布尔类型) //删除某个map中的某个key-value delete(amap , 1)//删除amap中key为1的数据 len(amap)//len函数获取map中元素得个数 for key,value := reange amap{//迭代获取amap中的全部数据 fmt.Println(key,value) }

go语言支持面向对象的特性,支持继承、封装、多态(对接口的重写)

结构体struct(类似于javabean)

type Student struct{//结构体的定义 name string age int16 code int32 } func main(){ //结构体的创建方式:,类似于变量的创建 //1 var su1 Student su1.name = "aaaa" //2 var su2 *Student = new(Student) //new函数创建,返回一个空间指针 (*su2).name = "1111" //3 var su3 *Student = Student{}//跟第二种new函数创建效果是一样的 (*su3).name = "2222" //4 Student := Student{"aa" , 2 ,3} //该创建方式必须将每一个值都写清楚,不能缺少 }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3